package xdu.lz.stage2_design_pattern.chapter3_observer_pattern.observerApp2;

/*
观察者设计模式：观察者设计模式解决的问题时当一个被关注的主题发生指定的动作时，要通过所有订阅者做出相应的处理。
需求： 编写一个气象站、一个工人两个类，当气象站更新天气 的时候，要通知人做出相应的处理。
问题1： 气象站更新了多次天气，然后人才做一次的处理。解决：放在线程里通知
问题2： 目前气象站只能通知一个人而已。解决：把一类人加入一个集合，通知集合
问题3： 在现实生活中出了工人群体要关注天气，其他 的群体也需要关注天气。
解决：让所有类的人都实现一个接口规则，把集合改为存储接口的集合，利用多态
观察者设计模式的步骤：
	1. 当目前对象发生指定的动作时，要通知另外一个对象做出相应的处理，这时候应该把对方的相应处理方法定义在接口上。
	2. 在当前对象维护接口的引用，当当前对象发生指定的动作这时候即可调用接口中的方法了。
*/

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * 主题：天气情况
 */
public class WeatherStationSubject {

    private String []weathers = {"晴天","雾霾","刮风","冰雹","下雪"};

	private String weather;

	/**
	 * 存放所有关注WeatherPrinciple主题的观察者
	 */
	List<WeatherObserver> observerList = new ArrayList<>();

	public void addListener(WeatherObserver e){
		observerList.add(e);
	}

	//开始更新天气，每1-1.5s更新一次
	public void startWork() throws Exception{
		new Thread(){
			public void run() {
				while(true){
					updateWeather();
					//天气变化后，要通知所有的观察者
					for(WeatherObserver observer : observerList){
						observer.notifyWeather(weather);
					}

					Random random = new Random();
					int ms = random.nextInt(501)+2000;
					try {
						Thread.sleep(ms);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

	public void updateWeather(){
		Random random = new Random();
		int index = random.nextInt(weathers.length);
		weather = weathers[index];
		System.out.println("当前天气是:"+weather);
	}
	
}
